﻿Imports WSEntidades
Imports Utilerias
Imports System.Xml

''' <summary>
''' Clase que valida las Secciones del Layout
''' </summary>
''' <remarks></remarks>
Public Class ValidaCFDi

    ''' <summary>
    ''' Función principal que invoca a las funciones correspondientes para la validación de cada sección del Layout.
    ''' </summary>
    ''' <param name="Txt">String con el contenido del txt (Separador Chr(10))</param>
    ''' <param name="Resp">Lista de Objeto RespuestaPremium para recolectar todos los errores existentes en Layout</param>
    ''' <param name="facturadorBE">Objeto de Facturador Web</param>
    ''' <param name="RutaLayout">Ruta de Archivo para generar nombre en Addenda MF</param>
    ''' <returns>Retorna True si es valido y False cuando existen errores</returns>
    ''' <remarks></remarks>
    Public Shared Function ValidaTxt(ByVal Txt As String, ByRef Resp As List(Of RespuestaPremium), _
                                     ByRef facturadorBE As WSFacturadorService.FacturadorBE, _
                                     ByVal RutaLayout As String) As Boolean
        Try
            '/-Variables Nivel Comprobante
            Dim comprobante As New Comprobante
            Dim tipoCFD As String = ""
            Dim currentCompr As New List(Of String())
            '-/'
            '/-Variables Nivel Complemento
            Dim Terceros As Terceros.PorCuentadeTerceros
            Dim LlevaTerParte As Boolean
            Dim LlevaTerAduana As Boolean
            Dim LlevaTerPredial As Boolean
            Dim impLocal As ImpuestosLocales = New ImpuestosLocales()
            Dim primeraVezImp As Boolean = True
            Dim Nomina As New Nomina.Nomina
            Dim primeraVezNom As Boolean = True
            Dim TGPercepcion As Decimal = 0
            Dim TEPercepcion As Decimal = 0
            Dim TGDeduccion As Decimal = 0
            Dim TEDeduccion As Decimal = 0
            Dim primeraVezDeta As Boolean = False
            Dim Detallista As New Detallista.detallista
            Dim Vehiculos As VentaVehiculos.VentaVehiculos
            Dim LlevaVeParte As Boolean
            Dim LlevaVeAduana As Boolean
            '-/'
            '/-Variables Nivel Addenda
            Dim listaAddenda As List(Of Addenda_BE) = New List(Of Addenda_BE)()
            Dim nombreAddenda As String = ""
            Dim xml As XmlDocument = New XmlDocument()
            Dim nodo As XmlNode = xml.DocumentElement()
            Dim addMF As New MasFactur.AddMasFactura.DocumentoFacturaMasFactura
            Dim exisMF As Boolean = False
            Dim exisSR As Boolean = False
            Dim cuentPed As Integer = 0
            Dim cuentArt As Integer = 0
            Dim addSR As New SR.AddSorianaReverse.DocumentoFacturaSorianaReverse
            Dim exisSantander As Boolean = False
            Dim addSantander As New Santander.TAddendaSantanderV1
            addSantander.InformacionPago = New Santander.TInformacionPago() {New Santander.TInformacionPago()}
            addSantander.InformacionEmision = New Santander.TInformacionEmision()
            addSantander.Basilea = New Santander.TBasilea
            addSantander.Inmuebles = New Santander.TInmuebles
            Dim ExisAMC As Boolean = False
            Dim AddAMC As New AMC71.ComprobanteAddenda
            Dim CuentArtAMC As Integer = 0
            Dim exisComa As Boolean = False
            Dim CuentArtComa As Integer = 0
            Dim addComa As New Coma.ADD_HEADER
            '-/'
            '/-Variables Txt'
            Dim Lineas As String() = DivideLinea(Txt, Chr(10))
            '-/'
            For Each Linea As String In Lineas
                Dim Elementos As String() = DivideLinea(Linea, "|")
                Select Case Elementos(0)
                    Case "01"
                        Seccion01(Elementos, Resp, comprobante, tipoCFD)

                    Case "02"
                        Seccion02(Elementos, Resp, comprobante, currentCompr)

                    Case "02-1"
                        Seccion021(Elementos, Resp, comprobante)

                    Case "02-2"
                        If (Terceros Is Nothing) Then
                            LlevaTerAduana = False
                            LlevaTerParte = False
                            LlevaTerPredial = False
                        End If
                        ValidaComplementos.ComplementoTERCEROS(Elementos, Resp, Terceros, comprobante, LlevaTerParte, LlevaTerAduana, LlevaTerPredial)

                    Case "02-3"
                        If (Vehiculos Is Nothing) Then
                            LlevaVeAduana = False
                            LlevaVeParte = False
                        End If
                        ValidaComplementos.ComplementoVENTAVEHICULOS(Elementos, Resp, Vehiculos, comprobante, LlevaVeParte, LlevaVeAduana)

                    Case "03"
                        Seccion03(Elementos, Resp, comprobante, listaAddenda, nombreAddenda, tipoCFD, nodo, xml)

                    Case "04"
                        ValidaComplementos.ComplementoIMPLOCALES(Elementos, Resp, primeraVezImp, impLocal)

                    Case "05"
                        Seccion05(Elementos, Resp, facturadorBE)

                    Case "06"
                        Seccion06(Elementos, Resp, comprobante)

                    Case "07"
                        ValidaAddendasComerciales.ValidaAddendaMF(Elementos, Resp, exisMF, comprobante, currentCompr, addMF, RutaLayout)

                    Case "08"
                        ValidaAddendasComerciales.ValidaAddendaSoriana(Elementos, Resp, exisSR, comprobante, addSR, comprobante.Impuestos, cuentPed, cuentArt, currentCompr)

                    Case "09"
                        ValidaComplementos.ComplementoNOMINA(Elementos, Resp, Nomina, tipoCFD, primeraVezNom, TGPercepcion, TEPercepcion, TGDeduccion, TEDeduccion)

                    Case "10"
                        ValidaAddendasComerciales.ValidaAddendaSantander(Elementos, Resp, comprobante, exisSantander, addSantander)

                    Case "11"
                        ValidaComplementos.ComplementoDETALLISTA(Elementos, Resp, primeraVezDeta, Detallista, tipoCFD, comprobante)

                    Case "12"
                        ValidaAddendasComerciales.ValidaAddendaAMC(Elementos, Resp, comprobante, tipoCFD, ExisAMC, AddAMC, CuentArtAMC, currentCompr)

                    Case "13"
                        ValidaAddendasComerciales.ValidaAddendaCOMA(Elementos, Resp, comprobante, exisComa, CuentArtComa, addComa, tipoCFD)
                    Case Else
                        AgregaRespuesta("00", 0, "El contenido del documento TXT no es correcto. La seccion " + Elementos(0) + " no corresponde con el formato especificado. No existe", Resp)
                End Select
            Next
            If (Resp.Count = 0) Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            AgregaRespuesta("00", 0, ex.Message, Resp)
            Return False
        End Try
    End Function

    ''' <summary>
    ''' Función que hace la separación del string recibido en el metodo ValidaTxt.
    ''' </summary>
    ''' <param name="Linea">Contenido de Layout</param>
    ''' <param name="Separador">Parametro para indicar cual sera el caracter para realizar la division de lineas</param>
    ''' <returns>Retorna Array de String si ocurre algun fallo retorna nothing</returns>
    ''' <remarks></remarks>
    Public Shared Function DivideLinea(ByVal Linea As String, ByVal Separador As String) As String()
        Dim Elementos As String()
        Try
            Elementos = Linea.Split(Separador)
            Return Elementos
        Catch ex As Exception
            Return Nothing
        End Try
    End Function

    ''' <summary>
    ''' Función que agrega mensaje de error a la lista del Objeto RespuestaPremium
    ''' </summary>
    ''' <param name="Linea">Sección a la que corresponde el error</param>
    ''' <param name="Columna">Numero de dato de la linea</param>
    ''' <param name="Descripcion">Mensaje de error</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadira el error</param>
    ''' <remarks></remarks>
    Public Shared Sub AgregaRespuesta(ByVal Linea As String, ByVal Columna As Int32, ByVal Descripcion As String, ByRef Resp As List(Of RespuestaPremium))
        Dim eResp As New RespuestaPremium
        Try
            eResp.Linea = Linea
            eResp.Columna = Columna
            eResp.Descripcion = Descripcion
            Resp.Add(eResp)
        Catch ex As Exception
        Finally
            eResp = Nothing
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la sección 01 del layout correspondiente a encabezado
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo comprobante que contendra la información del CFDI</param>
    ''' <param name="tipoCFD">Variable que contendra el tipo de comprobante</param>
    ''' <remarks></remarks>
    Public Shared Sub Seccion01(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                     ByRef comprobante As Comprobante, ByRef tipoCFD As String)
        Dim buscaRegimenEnBD As Boolean
        Dim desglosaIEPS As Boolean
        Dim domFiscal As New t_UbicacionFiscal
        Dim expedidoEn As New t_Ubicacion
        Dim domReceptor As New t_Ubicacion
        Dim impuestos As New ComprobanteImpuestos
        Dim mail As String = ""

        Try
            If (Elementos Is Nothing) Then
                AgregaRespuesta("01", 0, "La línea de la Seccion 01 no pudo ser procesada, no se logro realizar la separación de elementos.", Resp)
            End If
            'Procesa encabezado
            If ((Elementos.Length = 66 Or Elementos.Length = 67 Or Elementos.Length = 69) And Elementos(0) = "01") Then

                'Verificamos si se va a desglosar el IEPS
                Dim posIeps As Integer = 0
                If (Elementos.Length = 69) Then
                    buscaRegimenEnBD = False
                    posIeps = 68
                ElseIf (Elementos.Length = 67) Then
                    posIeps = 66
                    buscaRegimenEnBD = True
                Else : posIeps = 65
                End If

                If (Trim(Elementos(posIeps)) = "S") Then
                    desglosaIEPS = True
                ElseIf (Trim(Elementos(posIeps)) = "N") Then
                    desglosaIEPS = False
                Else : desglosaIEPS = True
                End If

                'Llenamos elemento COMPROBANTE
                tipoCFD = Trim(Elementos(1))
                tipoCFD = tipoCFD.ToUpper()
                If (tipoCFD <> "FA" And tipoCFD <> "CR" And tipoCFD <> "CA" And tipoCFD <> "RH" And tipoCFD <> "CP" And tipoCFD <> "RA" And tipoCFD <> "RN") Then
                    AgregaRespuesta("01", 2, "El contenido del documento TXT no es correcto.  El atributo 'Tipo CFD' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                ElseIf (tipoCFD = "") Then
                    AgregaRespuesta("01", 2, "El contenido del documento TXT no es correcto.  El atributo 'Tipo CFD' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End If

                comprobante.version = Elementos(2)
                csUtilsCFD.escribeAtributoConReglasA20CFDI("version", comprobante.version, True, Resp, "01", 3)
                If (comprobante.version = "") Then
                    AgregaRespuesta("01", 3, "El contenido del documento TXT no es correcto.  El atributo 'Versión' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End If

                If (Trim(Elementos(3)).Length > 0) Then
                    comprobante.serie = Elementos(3)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("serie", comprobante.serie, False, Resp, "01", 4)
                End If

                If (Trim(Elementos(4)).Length > 0) Then
                    comprobante.folio = Elementos(4)
                    If Not (IsNumeric(comprobante.folio)) Then
                        AgregaRespuesta("01", 5, "El contenido del documento TXT no es correcto, el atributo folio debe de ser un valor numerico", Resp)
                    End If
                Else
                    comprobante.folio = ""
                End If

                comprobante.formaDePago = Elementos(5)
                csUtilsCFD.escribeAtributoConReglasA20CFDI("forma de pago", comprobante.formaDePago, True, Resp, "01", 6)
                If (comprobante.formaDePago = "") Then
                    AgregaRespuesta("01", 6, "El contenido del documento TXT no es correcto.  El atributo 'Forma de Pago' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End If

                comprobante.noCertificado = Elementos(6)
                If (comprobante.noCertificado = "") Then
                    AgregaRespuesta("01", 7, "El contenido del documento TXT no es correcto.  El atributo 'Nùmero de Certificado' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End If

                comprobante.sello = ""

                comprobante.certificado = ""

                comprobante.Complemento = New ComprobanteComplemento()

                Dim fecha As DateTime = New DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, _
                                                     DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second)
                comprobante.fecha = fecha.AddMinutes(-5)

                If (Trim(Elementos(7)).Length > 0) Then
                    comprobante.condicionesDePago = Elementos(7)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Condiciones de Pago", comprobante.condicionesDePago, False, Resp, "01", 8)
                End If

                Try
                    comprobante.subTotal = CDec(Elementos(8))
                Catch ex As Exception
                    AgregaRespuesta("01", 9, "El contenido del documento TXT no es correcto.  El atributo 'Subtotal' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End Try

                Try
                    If (Elementos(9).ToString() <> "") Then
                        comprobante.descuento = CDec(Elementos(9))
                        comprobante.descuentoSpecified = True
                    End If
                Catch ex As Exception
                    AgregaRespuesta("01", 10, "El contenido del documento TXT no es correcto.  El atributo 'Descuento' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End Try

                If (Trim(Elementos(10)).Length > 0) Then
                    comprobante.motivoDescuento = Elementos(10)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Motivo Descuento", comprobante.motivoDescuento, False, Resp, "01", 11)
                End If

                Try
                    comprobante.total = CDec(Elementos(11))
                Catch ex As Exception
                    AgregaRespuesta("01", 12, "El contenido del documento TXT no es correcto.  El atributo 'Total' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End Try

                comprobante.metodoDePago = Elementos(12)
                csUtilsCFD.escribeAtributoConReglasA20CFDI("Metodo de pago", comprobante.metodoDePago, True, Resp, "01", 13)

                If (Elementos(13) = "") Then
                    AgregaRespuesta("01", 14, "El contenido del documento TXT no es correcto.  El atributo 'Tipo de Comprobante' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                Else
                    Select Case Elementos(13).ToUpper()
                        Case "INGRESO"
                            comprobante.tipoDeComprobante = ComprobanteTipoDeComprobante.ingreso
                        Case "EGRESO"
                            comprobante.tipoDeComprobante = ComprobanteTipoDeComprobante.egreso
                        Case "TRASLADO"
                            comprobante.tipoDeComprobante = ComprobanteTipoDeComprobante.traslado
                        Case Else
                            AgregaRespuesta("01", 14, "El contenido del documento TXT no es correcto.  El atributo 'Tipo de Comprobante' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                    End Select
                End If

                If (Trim(Elementos(14)).Length > 0) Then
                    If (Trim(Elementos(14)) <> "MXN" And Trim(Elementos(14)) <> "EUR" And Trim(Elementos(14)) <> "DLS" And _
                        Trim(Elementos(14)) <> "MXP" And Trim(Elementos(14)) <> "USD") Then
                        AgregaRespuesta("01", 15, "El contenido del documento TXT no es correcto.  El atributo 'Moneda' tiene un valor no válido de acuerdo a su tipo de datos. debe ser alguno de estos: MXN ,EUR, DLS", Resp)
                    Else
                        comprobante.Moneda = Elementos(14)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Moneda", comprobante.Moneda, False, Resp, "01", 15)
                    End If

                End If

                If (Trim(Elementos(15)).Length > 0) Then
                    comprobante.TipoCambio = Elementos(15)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Tipo de Cambio", comprobante.TipoCambio, False, Resp, "01", 16)
                End If


                If (Elementos(16).ToUpper() = "EMISOR") Then
                    'Llenamos el elemento EMISOR
                    comprobante.Emisor = New ComprobanteEmisor()
                    comprobante.Emisor.rfc = Elementos(17)
                    comprobante.Emisor.rfc = comprobante.Emisor.rfc.ToUpper()
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Rfc Emisor", comprobante.Emisor.rfc, True, Resp, "01", 18)
                    If (comprobante.Emisor.rfc = "") Then
                        AgregaRespuesta("01", 18, "El contenido del documento TXT no es correcto.  El atributo 'RFC' del Emisor tiene un valor no válido.", Resp)
                    End If

                    'PENDIENTE POR QUE EL REGIMEN SE OBTIENE DE BASE DE DATOS
                    'regimenEmisor.Regimen = regimen.Regimen
                    'ReDim emisor.RegimenFiscal(0)
                    'emisor.RegimenFiscal(0) = regimenEmisor

                    comprobante.Emisor.nombre = Elementos(18)

                    If (comprobante.Emisor.nombre = "") Then
                        AgregaRespuesta("01", 19, "El contenido del documento TXT no es correcto.  El atributo 'Nombre' del Emisor tiene un valor no válido.", Resp)
                    End If
                Else
                    AgregaRespuesta("01", 19, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador EMISOR.", Resp)
                End If

                If (Elementos(19).ToUpper() = "DOMICILIO FISCAL") Then
                    'Llenamos el elemento DOMICILIO FISCAL
                    domFiscal.calle = Elementos(20)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Calle Dom. Fiscal", domFiscal.calle, True, Resp, "01", 21)
                    If (domFiscal.calle = "") Then
                        AgregaRespuesta("01", 21, "El contenido del documento TXT no es correcto.  El atributo 'Calle' del Emisor tiene un valor no válido.", Resp)
                    End If

                    If (Trim(Elementos(21)).Length > 0) Then
                        domFiscal.noExterior = Elementos(21)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Exterior Dom. Fiscal", domFiscal.noExterior, False, Resp, "01", 22)
                    End If

                    If (Trim(Elementos(22)).Length > 0) Then
                        domFiscal.noInterior = Elementos(22)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("No interior Dom. Fiscal", domFiscal.noInterior, False, Resp, "01", 23)
                    End If

                    If (Trim(Elementos(23)).Length > 0) Then
                        domFiscal.colonia = Elementos(23)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Colonia Dom. Fiscal", domFiscal.colonia, False, Resp, "01", 24)
                    End If

                    If (Trim(Elementos(24)).Length > 0) Then
                        domFiscal.localidad = Elementos(24)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Localidad Dom. Fiscal", domFiscal.localidad, False, Resp, "01", 25)
                    End If

                    If (Trim(Elementos(25)).Length > 0) Then
                        domFiscal.referencia = Elementos(25)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Referencia Dom. Fiscal", domFiscal.referencia, False, Resp, "01", 26)
                    End If

                    domFiscal.municipio = Elementos(26)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Municipio Dom. Fiscal", domFiscal.municipio, True, Resp, "01", 27)
                    If (domFiscal.municipio = "") Then
                        AgregaRespuesta("01", 27, "El contenido del documento TXT no es correcto.  El atributo 'Municipio' del Emisor tiene un valor no válido.", Resp)
                    End If

                    domFiscal.estado = Elementos(27)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Estado Dom. Fiscal", domFiscal.estado, True, Resp, "01", 28)
                    If (domFiscal.estado = "") Then
                        AgregaRespuesta("01", 28, "El contenido del documento TXT no es correcto.  El atributo 'Estado' del Emisor tiene un valor no válido.", Resp)
                    End If

                    domFiscal.pais = Elementos(28)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Pais Dom. Fiscal", domFiscal.pais, True, Resp, "01", 29)
                    If (domFiscal.pais = "") Then
                        AgregaRespuesta("01", 29, "El contenido del documento TXT no es correcto.  El atributo 'País' del Emisor tiene un valor no válido.", Resp)
                    End If

                    domFiscal.codigoPostal = Elementos(29)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Codigo Postal Dom. Fiscal", domFiscal.codigoPostal, True, Resp, "01", 30)
                    If (domFiscal.codigoPostal = "" And domFiscal.codigoPostal.Length <> 5) Then
                        AgregaRespuesta("01", 30, "El contenido del documento TXT no es correcto.  El atributo 'CP' del Emisor tiene un valor no válido.", Resp)
                    End If

                    comprobante.Emisor.DomicilioFiscal = domFiscal 'Agregamos el domicilio fiscal al emisor
                Else
                    AgregaRespuesta("01", 20, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador DOMICILIO FISCAL.", Resp)
                End If

                If (Elementos(30).ToUpper() = "EXPEDIDOEN") Then
                    If Not (Trim(Elementos(39)) = "") Then
                        'Llenamos el elemento EXPEDIDO EN 

                        If (Trim(Elementos(31)).Length > 0) Then
                            expedidoEn.calle = Elementos(31).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Calle Expedidos", expedidoEn.calle, False, Resp, "01", 32)
                        End If
                        If (Trim(Elementos(32)).Length > 0) Then
                            expedidoEn.noExterior = Elementos(32).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Exterior Expedidos", expedidoEn.noExterior, False, Resp, "01", 33)
                        End If
                        If (Trim(Elementos(33)).Length > 0) Then
                            expedidoEn.noInterior = Elementos(33).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Interior.", expedidoEn.noInterior, False, Resp, "01", 34)
                        End If
                        If (Trim(Elementos(34)).Length > 0) Then
                            expedidoEn.colonia = Elementos(34).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Colonia Expedidos", expedidoEn.colonia, False, Resp, "01", 35)
                        End If
                        If (Trim(Elementos(35)).Length > 0) Then
                            expedidoEn.localidad = Elementos(35).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Localidad Expedidos", expedidoEn.localidad, False, Resp, "01", 36)
                        End If
                        If (Trim(Elementos(36)).Length > 0) Then
                            expedidoEn.referencia = Elementos(36).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Referencia Expedidos", expedidoEn.referencia, False, Resp, "01", 37)
                        End If
                        If (Trim(Elementos(37)).Length > 0) Then
                            expedidoEn.municipio = Elementos(37).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Municipio Expedidos", expedidoEn.municipio, False, Resp, "01", 38)
                        End If
                        If (Trim(Elementos(38)).Length > 0) Then
                            expedidoEn.estado = Elementos(38).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Estado Expedidos", expedidoEn.estado, False, Resp, "01", 39)
                        End If
                        If (Trim(Elementos(39)).Length > 0) Then
                            expedidoEn.pais = Elementos(39).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Pais Expedidos", expedidoEn.pais, True, Resp, "01", 40)
                        End If
                        If (Trim(Elementos(40)).Length > 0) Then
                            expedidoEn.codigoPostal = Elementos(40).Trim()
                            csUtilsCFD.escribeAtributoConReglasA20CFDI("Codigo Postal Expedidos", expedidoEn.codigoPostal, False, Resp, "01", 41)
                        End If

                        comprobante.Emisor.ExpedidoEn = expedidoEn
                    End If
                Else
                    AgregaRespuesta("01", 31, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador EXPEDIDOEN.", Resp)
                End If

                If (Elementos(41).ToUpper() = "RECEPTOR") Then
                    'Llenamos el elemento RECEPTOR
                    comprobante.Receptor = New ComprobanteReceptor()
                    comprobante.Receptor.rfc = Elementos(42)
                    comprobante.Receptor.rfc = comprobante.Receptor.rfc.ToUpper()
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("RFC Receptor", comprobante.Receptor.rfc, True, Resp, "01", 43)
                    If (comprobante.Receptor.rfc = "") Then
                        AgregaRespuesta("01", 43, "El contenido del documento TXT no es correcto.  El atributo 'RFC' del RECEPTOR tiene un valor no válido.", Resp)
                    ElseIf Not (csValidaciones.valida_RFC(comprobante.Receptor.rfc, "T")) Then
                        AgregaRespuesta("01", 43, "El contenido del documento TXT no es correcto.  El atributo 'RFC' del RECEPTOR no cumple con la estructura de un RFC.", Resp)
                    End If

                    comprobante.Receptor.nombre = Elementos(43)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("Nombre Receptor", comprobante.Receptor.nombre, False, Resp, "01", 44)
                    If (comprobante.Receptor.nombre = "") Then
                        comprobante.Receptor.nombre = Nothing
                    End If
                Else
                    AgregaRespuesta("01", 42, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador RECEPTOR.", Resp)
                End If

                If (Elementos(44).ToUpper() = "DOMICILIO FISCAL_R") Then
                    'Llenamos el elemento DOMICILIO DEL RECEPTOR

                    If (Elementos(45).Length > 0) Then
                        domReceptor.calle = Elementos(45)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Calle Receptor", domReceptor.calle, False, Resp, "01", 46)
                    End If

                    domReceptor.noExterior = Elementos(46)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Exterior Receptor", domReceptor.noExterior, False, Resp, "01", 47)
                    If (domReceptor.noExterior = "") Then
                        domReceptor.noExterior = Nothing
                    End If

                    If (Elementos(47).Length > 0) Then
                        domReceptor.noInterior = Elementos(47)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Interior Receptor", domReceptor.noInterior, False, Resp, "01", 48)
                    End If

                    If (Elementos(48).Length > 0) Then
                        domReceptor.colonia = Elementos(48)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Colonia Receptor", domReceptor.colonia, False, Resp, "01", 49)
                    End If

                    If (Elementos(49).Length > 0) Then
                        domReceptor.localidad = Elementos(49)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Localidad Receptor", domReceptor.localidad, False, Resp, "01", 50)
                    End If

                    If (Elementos(50).Length > 0) Then
                        domReceptor.referencia = Elementos(50)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Referencia Receptor", domReceptor.referencia, False, Resp, "01", 51)
                    End If

                    If (Elementos(51).Length > 0) Then
                        domReceptor.municipio = Elementos(51)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Municipio Receptor", domReceptor.municipio, False, Resp, "01", 52)
                    End If

                    If (Elementos(52).Length > 0) Then
                        domReceptor.estado = Elementos(52)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Estado Receptor", domReceptor.estado, False, Resp, "01", 53)
                    End If

                    If (Elementos(53).Length > 0) Then
                        domReceptor.pais = Elementos(53)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Pais Receptor", domReceptor.pais, False, Resp, "01", 54)
                    End If

                    If (Elementos(54).Length > 0) Then
                        domReceptor.codigoPostal = Elementos(54)
                        If (domReceptor.codigoPostal.Length > 0) Then
                            If (domReceptor.codigoPostal.Length <> 5) Then
                                AgregaRespuesta("01", 55, "El contenido del documento TXT no es correcto.  El atributo 'Codigo Postal' del Domicilio del Receptor tiene un valor no válido.", Resp)
                            End If
                        End If
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Codigo Postal Receptor", domReceptor.codigoPostal, False, Resp, "01", 55)
                    End If

                    mail = Elementos(55).Trim()

                    If (domReceptor.calle Is Nothing And domReceptor.codigoPostal Is Nothing And domReceptor.colonia Is Nothing _
                       And domReceptor.estado Is Nothing And domReceptor.localidad Is Nothing And domReceptor.municipio Is Nothing _
                       And domReceptor.noExterior Is Nothing And domReceptor.noInterior Is Nothing And domReceptor.pais Is Nothing _
                       And domReceptor.referencia Is Nothing) Then
                        comprobante.Receptor.Domicilio = Nothing
                    Else
                        comprobante.Receptor.Domicilio = domReceptor
                    End If
                Else
                    AgregaRespuesta("01", 45, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador DOMICILIO FISCAL_R.", Resp)
                End If

                'Llenamos el elemento IMPUESTOS
                Try
                    impuestos.totalImpuestosRetenidos = CDec(Elementos(56))
                    impuestos.totalImpuestosRetenidosSpecified = True
                Catch ex As Exception
                    impuestos.totalImpuestosRetenidos = 0D
                    impuestos.totalImpuestosRetenidosSpecified = False
                End Try
                Try
                    impuestos.totalImpuestosTrasladados = CDec(Elementos(57))
                    impuestos.totalImpuestosTrasladadosSpecified = True
                Catch ex As Exception
                    impuestos.totalImpuestosTrasladados = 0D
                    impuestos.totalImpuestosTrasladadosSpecified = False
                End Try

                If (Elementos(58).ToUpper() = "RETENIDOS") Then
                    'Llenamos el elemento RETENCION
                    If (Elementos(59).ToUpper() = "IVA") Then
                        'Llenamos el renglon IVA RETENIDO
                        'Aqui se considera currentrow(60)
                        Dim retencion As New ComprobanteImpuestosRetencion
                        retencion.impuesto = ComprobanteImpuestosRetencionImpuesto.IVA
                        Try
                            retencion.importe = CDec(Elementos(61))
                        Catch ex As Exception
                            retencion.importe = 0D
                        End Try
                        If (retencion.importe > 0) Then
                            If (impuestos.Retenciones Is Nothing) Then
                                ReDim impuestos.Retenciones(0)
                            Else
                                ReDim Preserve impuestos.Retenciones(impuestos.Retenciones.Length)
                            End If
                            impuestos.Retenciones(impuestos.Retenciones.Length - 1) = retencion
                        End If
                    Else
                        AgregaRespuesta("01", 60, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador IVA.", Resp)
                    End If

                    If (Elementos(62).ToUpper() = "ISR") Then
                        'Llenamos el renglon ISR RETENIDO
                        Dim retencion As New ComprobanteImpuestosRetencion
                        retencion.impuesto = ComprobanteImpuestosRetencionImpuesto.ISR
                        Try
                            retencion.importe = CDec(Elementos(64))
                        Catch ex As Exception
                            retencion.importe = 0D
                        End Try
                        If (retencion.importe > 0) Then
                            If (impuestos.Retenciones Is Nothing) Then
                                ReDim impuestos.Retenciones(0)
                            Else
                                ReDim Preserve impuestos.Retenciones(impuestos.Retenciones.Length)
                            End If
                            impuestos.Retenciones(impuestos.Retenciones.Length - 1) = retencion
                        End If
                    Else
                        AgregaRespuesta("01", 63, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador ISR.", Resp)
                    End If

                Else
                    AgregaRespuesta("01", 59, "El contenido del documento TXT no es correcto.  El Encabezado no contiene el Indicador RETENIDOS.", Resp)
                End If

                '''''''''''''''''''''''''''Se agrega modificación para la versión 3.X se agrega el domicilio fiscal en un solo campo

                comprobante.LugarExpedicion = Elementos(65)
                csUtilsCFD.escribeAtributoConReglasA20CFDI("Lugar de Expedicion", comprobante.LugarExpedicion, True, Resp, "01", 66)
                '''''''En caso de que no se busque elregimen en la BD, significa que lleva el parametro de Número de cuenta
                '''''''por lo tanto como es opcional verificamos si existe.
                If Not (buscaRegimenEnBD) Then
                    If (Elementos(67).Trim() <> "" And Elementos(67).Length >= 4) Then
                        comprobante.NumCtaPago = Elementos(67)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Cuenta de Pago", comprobante.NumCtaPago, False, Resp, "01", 68)
                    End If
                End If
                '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

            Else
                AgregaRespuesta("01", 0, "El contenido del documento TXT no es correcto.  El Encabezado no contiene todos los elementos especificados.", Resp)
            End If

        Catch ex As Exception
            AgregaRespuesta("01", 0, ex.Message, Resp)
        Finally
            buscaRegimenEnBD = Nothing
            desglosaIEPS = Nothing
            domFiscal = Nothing
            expedidoEn = Nothing
            domReceptor = Nothing
            impuestos = Nothing
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la sección 02 del layout correspondiente a partidas
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo comprobante que contendra la información del CFDI</param>
    ''' <param name="currentCompr">Lista de String que contendra la información adicional del concepto</param>
    ''' <remarks></remarks>
    Public Shared Sub Seccion02(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                     ByRef comprobante As Comprobante, ByRef currentCompr As List(Of String()))
        Dim tipoCFD As String = ""
        Dim domFiscal As New t_UbicacionFiscal
        Dim expedidoEn As New t_Ubicacion
        Dim domReceptor As New t_Ubicacion
        Dim impuestos As New ComprobanteImpuestos
        Dim mail As String = ""

        Try
            If (Elementos Is Nothing) Then
                AgregaRespuesta("02", 0, "La línea de la Seccion 02 no pudo ser procesada, no se logro realizar la separación de elementos.", Resp)
            End If

            If ((Elementos.Length = 20 Or Elementos.Length = 27) And Elementos(0) = "02") Then
                'Llenamos el elemento CONCEPTO
                Dim concepto As New ComprobanteConcepto()
                Dim cBE As New conceptosBE()
                Dim i As Integer = CInt(Elementos(1)) - 1
                ' concepto.noIdentificacion = currentRow(1) No se toma en cuenta

                Try
                    concepto.cantidad = CDec(Elementos(2))
                    cBE.Cantidad = CDec(Elementos(2))
                Catch ex As Exception
                    AgregaRespuesta("02", 3, "El contenido del documento TXT no es correcto.  El atributo 'Cantidad' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End Try

                '''''''La unidad ahora se vuelve obligatoria
                concepto.unidad = Elementos(3)
                cBE.Unidad = Elementos(3)
                csUtilsCFD.escribeAtributoConReglasA20CFDI("Unidad Concepto", concepto.unidad, True, Resp, "02", 4)

                If (Trim(Elementos(4)).Length > 0) Then
                    concepto.noIdentificacion = Elementos(4)
                    cBE.NoIdentificacion = Elementos(4)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Identificacion Concepto", concepto.noIdentificacion, False, Resp, "02", 5)
                End If

                concepto.descripcion = Elementos(5)
                cBE.Descripcion = Elementos(5)
                csUtilsCFD.escribeAtributoConReglasA20CFDI("Descripcion", concepto.descripcion, True, Resp, "02", 6)

                If (concepto.descripcion = "") Then
                    AgregaRespuesta("02", 6, "El contenido del documento TXT no es correcto.  El atributo 'Descripción' del Concepto tiene un valor no válido.", Resp)
                End If

                Try
                    concepto.valorUnitario = CDec(Elementos(6))
                    cBE.ValorUnitario = CDec(Elementos(6))
                Catch ex As Exception
                    AgregaRespuesta("02", 7, "El contenido del documento TXT no es correcto.  El atributo 'Precio Unitario' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End Try

                Try
                    cBE.ValDescValorUnitario = CDec(Elementos(7))
                Catch ex As Exception
                    cBE.ValDescValorUnitario = 0
                End Try

                Try
                    concepto.importe = CDec(Elementos(8))
                    cBE.Importe = CDec(Elementos(8))
                    cBE.ImporteConDesc = cBE.Importe - cBE.ValDescValorUnitario
                Catch ex As Exception
                    AgregaRespuesta("02", 9, "El contenido del documento TXT no es correcto.  El atributo 'Importe' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End Try

                Dim aduana As New t_InformacionAduanera()

                If (Trim(Elementos(9)).Length > 0 And Trim(Elementos(10)).Length > 0 And Trim(Elementos(11)).Length > 0) Then
                    Try
                        cBE.FechaAduana = DateTime.ParseExact(Elementos(10), "yyyy-MM-dd", Nothing)
                        aduana.fecha = DateTime.ParseExact(Elementos(10), "yyyy-MM-dd", Nothing)
                        aduana.numero = Elementos(9)
                        cBE.NumAduana = Elementos(9)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Numero Aduana", aduana.numero, True, Resp, "02", 10)
                        aduana.aduana = Elementos(11)
                        cBE.NombreAduana = Elementos(11)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Aduana", aduana.aduana, True, Resp, "02", 12)
                    Catch ex As Exception
                        AgregaRespuesta("02", 10, "El contenido del documento TXT no es correcto.  El atributo 'Fecha Pedimento' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                    End Try
                ElseIf (Trim(Elementos(9)).Length > 0 Or Trim(Elementos(10)).Length > 0 Or Trim(Elementos(11)).Length > 0) Then
                    AgregaRespuesta("02", 10, "El contenido del documento TXT no es correcto.  El Nodo Información Aduanera está incompleto tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End If

                If Not (aduana.aduana Is Nothing Or aduana.numero Is Nothing) Then
                    If (concepto.Items Is Nothing) Then
                        ReDim concepto.Items(0)
                    Else
                        ReDim Preserve concepto.Items(concepto.Items.Length)
                    End If
                    concepto.Items(concepto.Items.Length - 1) = aduana
                End If

                Dim cuentaPredial As New ComprobanteConceptoCuentaPredial()

                If (Trim(Elementos(12)).Length > 0) Then
                    cuentaPredial.numero = Elementos(12)
                    cBE.Predial = Elementos(12)
                    csUtilsCFD.escribeAtributoConReglasA20CFDI("No. Predial", cuentaPredial.numero, True, Resp, "02", 13)
                    If (concepto.Items Is Nothing) Then 'Solo puede ir solo el num. predial
                        ReDim concepto.Items(0) ' No puede ir acompañado de aduanas por eso solo si es nothing se agrega
                        concepto.Items(concepto.Items.Length - 1) = cuentaPredial 'Agrego cuenta predial
                    End If
                End If

                If (tipoCFD = "RA") Then        'RECIBO DE ARRENDAMIENTO
                    If (cuentaPredial.numero = "") Then
                        AgregaRespuesta("02", 13, "El contenido del documento TXT no es correcto.  El atributo 'Número de Predial' del Concepto tiene un valor no válido.", Resp)
                    End If
                End If

                If (Elementos(13).ToUpper() = "TRASLADADOS") Then
                    If (Elementos(14).ToUpper() = "IVA") Then
                        Try
                            Dim ExisteIva As Boolean = False
                            If (impuestos.Traslados Is Nothing) Then
                                If (Elementos(15) <> "EXENTO") Then
                                    ReDim impuestos.Traslados(0)
                                    impuestos.Traslados(0) = New ComprobanteImpuestosTraslado
                                    impuestos.Traslados(0).impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA
                                    impuestos.Traslados(0).tasa = CDec(Elementos(15))
                                    impuestos.Traslados(0).importe = CDec(Elementos(16))
                                    cBE.tasaIVA = CDec(Elementos(15))
                                    cBE.impIVA = CDec(Elementos(16))
                                    If (CDec(Elementos(15)) = 0D) Then
                                        cBE.tipoIVA = "C"
                                    Else
                                        cBE.tipoIVA = "N"
                                    End If
                                    i = i + 1
                                Else
                                    cBE.tasaIVA = 0
                                    cBE.tipoIVA = "E"
                                    cBE.impIVA = 0
                                End If
                            Else
                                For Each iva As ComprobanteImpuestosTraslado In impuestos.Traslados
                                    If (Elementos(15) <> "EXENTO") Then
                                        If (CDec(Elementos(15)) = iva.tasa And iva.impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA) Then
                                            ExisteIva = True
                                            iva.importe += CDec(Elementos(16))
                                            cBE.tasaIVA = CDec(Elementos(15))
                                            cBE.impIVA = CDec(Elementos(16))
                                            If (CDec(Elementos(15)) = 0D) Then
                                                cBE.tipoIVA = "C"
                                            Else
                                                cBE.tipoIVA = "N"
                                            End If
                                            Exit For
                                        End If
                                    End If
                                Next
                                If (ExisteIva = False) Then
                                    If (Elementos(15) <> "EXENTO") Then
                                        ReDim Preserve impuestos.Traslados(impuestos.Traslados.Length)
                                        impuestos.Traslados(i) = New ComprobanteImpuestosTraslado
                                        impuestos.Traslados(i).impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA
                                        cBE.tasaIVA = CDec(Elementos(15))
                                        If (CDec(Elementos(15)) = 0D) Then
                                            cBE.tipoIVA = "C"
                                        Else
                                            cBE.tipoIVA = "N"
                                        End If
                                        cBE.impIVA = CDec(Elementos(16))
                                        impuestos.Traslados(i).tasa = CDec(Elementos(15))
                                        impuestos.Traslados(i).importe = CDec(Elementos(16))
                                        i = i + 1
                                    Else
                                        cBE.tasaIVA = 0
                                        cBE.tipoIVA = "E"
                                        cBE.impIVA = 0
                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            AgregaRespuesta("02", 17, "El contenido del documento TXT no es correcto.  El atributo 'Importe IVA' del Concepto tiene un valor no válido.", Resp)
                        End Try
                    Else
                        AgregaRespuesta("02", 15, "El contenido del documento TXT no es correcto.  El Concepto no contiene el Indicador IVA.", Resp)
                    End If

                    If (Elementos(17).ToUpper() = "IEPS") Then

                        Try
                            Dim ExisteIeps As Boolean = False
                            If (impuestos.Traslados Is Nothing) Then
                                If (Elementos(18) <> "EXENTO") Then
                                    If (CDec(Elementos(18)) > 0D) Then
                                        ReDim impuestos.Traslados(0)
                                        impuestos.Traslados(0) = New ComprobanteImpuestosTraslado
                                        impuestos.Traslados(0).impuesto = ComprobanteImpuestosTrasladoImpuesto.IEPS
                                        impuestos.Traslados(0).tasa = CDec(Elementos(18))
                                        impuestos.Traslados(0).importe = CDec(Elementos(19))
                                        cBE.tasaIEPS = CDec(Elementos(18))
                                        cBE.impIEPS = CDec(Elementos(19))
                                        i = i + 1
                                    Else
                                        cBE.tasaIEPS = 0
                                        cBE.impIEPS = 0
                                    End If
                                Else
                                    cBE.tasaIEPS = 0
                                    cBE.impIEPS = 0
                                End If
                            Else
                                For Each ieps As ComprobanteImpuestosTraslado In impuestos.Traslados
                                    If (Elementos(18) <> "EXENTO") Then
                                        If (CDec(Elementos(18)) > 0D) Then
                                            If (CDec(Elementos(18)) = ieps.tasa And ieps.impuesto = ComprobanteImpuestosTrasladoImpuesto.IEPS) Then
                                                ExisteIeps = True
                                                ieps.importe += CDec(Elementos(19))
                                                cBE.tasaIEPS = CDec(Elementos(18))
                                                cBE.impIEPS = CDec(Elementos(19))
                                                Exit For
                                            End If
                                        End If
                                    End If
                                Next
                                If (ExisteIeps = False) Then
                                    If (Elementos(18) <> "EXENTO") Then
                                        If (CDec(Elementos(18)) > 0D) Then
                                            ReDim Preserve impuestos.Traslados(impuestos.Traslados.Length)
                                            impuestos.Traslados(i) = New ComprobanteImpuestosTraslado
                                            impuestos.Traslados(i).impuesto = ComprobanteImpuestosTrasladoImpuesto.IEPS

                                            cBE.tasaIEPS = CDec(Elementos(18))
                                            cBE.impIEPS = CDec(Elementos(19))
                                            impuestos.Traslados(i).tasa = CDec(Elementos(18))
                                            impuestos.Traslados(i).importe = CDec(Elementos(19))
                                            i = i + 1
                                        Else
                                            cBE.tasaIEPS = 0
                                            cBE.impIEPS = 0
                                        End If
                                    Else
                                        cBE.tasaIEPS = 0
                                        cBE.impIEPS = 0
                                    End If
                                End If
                            End If

                        Catch ex As Exception
                            AgregaRespuesta("02", 20, "El contenido del documento TXT no es correcto.  El atributo 'Importe IEPS' del Concepto tiene un valor no válido.", Resp)
                        End Try
                    Else
                        AgregaRespuesta("02", 18, "El contenido del documento TXT no es correcto.  El Concepto no contiene el Indicador IVA.", Resp)
                    End If
                Else
                    AgregaRespuesta("02", 14, "El contenido del documento TXT no es correcto.  El Concepto no contiene el Indicador TRASLADADOS.", Resp)
                End If

                If (comprobante.Conceptos Is Nothing) Then
                    ReDim comprobante.Conceptos(0)
                    'listConceptoBE.Add(cBE)
                Else
                    ReDim Preserve comprobante.Conceptos(comprobante.Conceptos.Length)
                    'listConceptoBE.Add(cBE)
                End If

                If (Elementos.Length = 27) Then
                    ValidaComplementos.ComplementoIEDU(Elementos, concepto, Resp)
                End If
                comprobante.Conceptos(comprobante.Conceptos.Length - 1) = concepto
                currentCompr.Add(Elementos)
            Else
                AgregaRespuesta("02", 0, "El contenido del documento TXT no es correcto. La seccion 02 no corresponde con el formato especificado", Resp)
            End If

        Catch ex As Exception
            AgregaRespuesta("02", 0, ex.Message, Resp)
        Finally
            domFiscal = Nothing
            expedidoEn = Nothing
            domReceptor = Nothing
            impuestos = Nothing
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la sección 02-1 del layout correspondiente a aduanas
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo comprobante que contendra la información del CFDI</param>
    ''' <remarks></remarks>
    Public Shared Sub Seccion021(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                      ByRef comprobante As Comprobante)
        Try
            If (Elementos.Length = 4 And Elementos(0) = "02-1") Then
                Dim aduana As New t_InformacionAduanera()
                If (Trim(Elementos(1)).Length > 0 And Trim(Elementos(2)).Length > 0 And Trim(Elementos(3)).Length > 0) Then
                    Try
                        aduana.fecha = DateTime.ParseExact(Elementos(2), "yyyy-MM-dd", Nothing)
                        aduana.numero = Elementos(1)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Numero Aduana", aduana.numero, True, Resp, "02-1", 2)
                        aduana.aduana = Elementos(3)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("Aduana", aduana.aduana, True, Resp, "02-1", 4)
                    Catch ex As Exception
                        AgregaRespuesta("02-1", 0, "El contenido del documento TXT no es correcto.  El atributo 'Fecha Pedimento' tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                    End Try
                Else
                    AgregaRespuesta("02-1", 0, "El contenido del documento TXT no es correcto.  El Nodo Información Aduanera está incompleto tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                End If
                Dim c = comprobante.Conceptos(comprobante.Conceptos.Length - 1)
                If (c.Items Is Nothing) Then
                    ReDim c.Items(0)
                Else
                    ReDim Preserve c.Items(c.Items.Length)
                End If
                c.Items(c.Items.Length - 1) = aduana
                comprobante.Conceptos(comprobante.Conceptos.Length - 1) = c
            Else
                AgregaRespuesta("02-1", 0, "El contenido del documento TXT no es correcto. La seccion 02-1 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            AgregaRespuesta("02-1", 0, ex.Message, Resp)
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la sección 03 del layout correspondiente a addenda
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">LIsta de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo comprobante que contendra la información del CFDI</param>
    ''' <param name="listaAddenda">Lista de elementos de la addenda</param>
    ''' <param name="nombreAddenda">Variable que guarda el nombre de la addenda</param>
    ''' <param name="tipoCFD">Variable que contendra el tipo de comprobante</param>
    ''' <param name="nodo">Nodo que tendra almacenada la addenda en forma de XML</param>
    ''' <param name="Xml">Documento XML a partir del cual se generara el nodo addenda</param>
    ''' <remarks>Se realiza una conexión a base para identificar si la clave de la addenda esta activada para el cliente</remarks>
    Public Shared Sub Seccion03(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                ByRef comprobante As Comprobante, ByRef listaAddenda As List(Of Addenda_BE), _
                                ByRef nombreAddenda As String, ByVal tipoCFD As String, ByRef nodo As XmlNode, _
                                ByRef Xml As XmlDocument)
        Dim addendabe = New AddendaBE()
        Dim addenda As Addenda_BE
        Dim resAddenda As String = ""
        Dim cfdi2 As csUtilsCFDI2 = New csUtilsCFDI2()
        Try
            If (Elementos.Length = 5 And Elementos(0) = "03") Then

                If (Elementos(1) = "CVEADD") Then
                    'addendabe = addendadal.getAddendaByDescripcion(Elementos(2), comprobante.Emisor.rfc, Conexion)
                    'If Not (addendabe Is Nothing) Then
                    If (listaAddenda.Count > 0) Then 'Ya se estaba procesando uno nuevo

                        Dim add As ValidaAddendas = New ValidaAddendas()
                        Dim mensaje As String = ""

                        resAddenda = add.generaAddenda(nombreAddenda, listaAddenda, Resp)
                        If (resAddenda <> "") Then
                            nodo = cfdi2.nodeNota(resAddenda, Xml)
                            comprobante.Addenda = New ComprobanteAddenda()
                            ReDim comprobante.Addenda.Any(0)
                            comprobante.Addenda.Any(0) = nodo
                        End If

                        nombreAddenda = Elementos(2)
                        listaAddenda = Nothing
                        listaAddenda = New List(Of Addenda_BE)()
                    Else
                        nombreAddenda = Elementos(2)
                        If ((nombreAddenda = "CARTAPORTE" Or nombreAddenda = "CPTAL") And (tipoCFD <> "CP" And tipoCFD <> "FA")) Then
                            If (nombreAddenda = "CARTAPORTE") Then
                                AgregaRespuesta("03", 3, "La Addenda Carta Porte solo puede ser para documentos tipo CP o FA el cual solo acepta (TELEFONO,SLOGAN,CORREO,PAGINAWEB)", Resp)
                            Else
                                AgregaRespuesta("03", 3, "La Addenda Carta Porte solo puede ser para documentos tipo CP o FA", Resp)
                            End If
                            addendabe = Nothing
                        End If
                    End If
                    'End If

                Else
                    If Not (addendabe Is Nothing) Then
                        addenda = New Addenda_BE()
                        addenda.Atributo = Elementos(1)
                        addenda.Valor = Elementos(2)
                        addenda.Nivel = Elementos(3)
                        addenda.Partida = Elementos(4)
                        listaAddenda.Add(addenda)
                    End If
                End If
            Else
                AgregaRespuesta("03", 0, "El contenido del documento TXT no es correcto. La seccion 03 no corresponde con el formato especificado", Resp)
            End If

        Catch ex As Exception
            AgregaRespuesta("03", 0, ex.Message, Resp)
        Finally
            addendabe = Nothing
            cfdi2 = Nothing
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la sección 05 del layout correspondiente a facturador web
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="facturadorBE">Objeto que contendra la información correspondiente al facturador web</param>
    ''' <remarks></remarks>
    Public Shared Sub Seccion05(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                ByRef facturadorBE As WSFacturadorService.FacturadorBE)
        Try
            If (Elementos(0) = "05" And Elementos.Length = 7) Then
                If Not (facturadorBE Is Nothing) Then
                    AgregaRespuesta("05", 0, "La información para timbrar hacia Facturador Web solo puede ser incluida una sola vez", Resp)
                End If
                facturadorBE = New WSFacturadorService.FacturadorBE()
                facturadorBE.claveSucursal = Elementos(1)
                facturadorBE.claveTicket = Elementos(2)
                facturadorBE.fechaTicket = CDate(Elementos(3))
                If (Elementos(4) = "TXT") Then
                    facturadorBE.tipoArchivo = WSFacturadorService.FacturadorService.XmlProcesstipoArchivo.TXT
                ElseIf (Elementos(4) = "XML") Then
                    facturadorBE.tipoArchivo = WSFacturadorService.FacturadorService.XmlProcesstipoArchivo.XML
                Else
                    AgregaRespuesta("05", 5, "El contenido del documento TXT no es correcto. El tipo de archivo debe de ser TXT o XML", Resp)
                End If
                facturadorBE.aleatorio = Elementos(5)
                If (Elementos(6) = "S") Then
                    facturadorBE.facturaInmediato = True
                Else
                    facturadorBE.facturaInmediato = False
                End If
            Else
                AgregaRespuesta("05", 0, "El contenido del documento TXT no es correcto. La seccion 05 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            AgregaRespuesta("05", 0, ex.Message, Resp)
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la sección 06 del layout correspondiente a Pago en Parcialidades
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo comprobante que contendra la información del CFDI</param>
    ''' <remarks></remarks>
    Public Shared Sub Seccion06(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                ByRef comprobante As Comprobante)
        Try
            If (Elementos(0) = "06") Then
                If (Elementos.Length = 5) Then
                    If ((comprobante.formaDePago.ToUpper.Contains("EXHIBICIÓN") Or _
                        comprobante.formaDePago.ToUpper.Contains("EXHIBICION")) And _
                        comprobante.Emisor.rfc <> "GGM981127UJ1" And comprobante.Emisor.rfc <> "GGM970514ER9" And _
                        comprobante.Emisor.rfc <> "IGG970821728" And comprobante.Emisor.rfc <> "PRE0302242D7" And _
                        comprobante.Emisor.rfc <> "SSG971216DG9" And comprobante.Emisor.rfc <> "GGM0203114K2" And _
                        comprobante.Emisor.rfc <> "OKA000427NV2" And comprobante.Emisor.rfc <> "CAMN8004301K0" And _
                        comprobante.Emisor.rfc <> "OMC100818GZ7") Then
                        AgregaRespuesta("06", 0, "El contenido del documento TXT no es correcto, La forma de pago no requiere del modulo 06", Resp)
                    End If

                    If (Trim(Elementos(1)).Length > 0) Then
                        comprobante.FolioFiscalOrig = Elementos(1)
                    End If
                    If (Trim(Elementos(2)).Length > 0) Then
                        comprobante.SerieFolioFiscalOrig = Elementos(2)
                        csUtilsCFD.escribeAtributoConReglasA20CFDI("serie", comprobante.SerieFolioFiscalOrig, False, Resp, "06", 3)
                    Else
                        AgregaRespuesta("06", 3, "El contenido del documento TXT no es correcto, no se especifica el atributo serie folio fiscal original.", Resp)
                    End If
                    If (Trim(Elementos(3)).Length > 0) Then
                        Try
                            comprobante.FechaFolioFiscalOrig = Convert.ToDateTime(Elementos(3))
                            comprobante.FechaFolioFiscalOrigSpecified = True
                        Catch ex As Exception
                            AgregaRespuesta("06", 4, "El contenido del documento TXT no es correcto, el atributo fecha folio fiscal original tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                        End Try
                    Else
                        AgregaRespuesta("06", 4, "El contenido del documento TXT no es correcto, no se especifica el atributo fecha folio fiscal original.", Resp)
                    End If
                    If (Trim(Elementos(4)).Length > 0) Then
                        Try
                            comprobante.MontoFolioFiscalOrig = CDec(Elementos(4))
                            comprobante.MontoFolioFiscalOrigSpecified = True
                        Catch ex As Exception
                            AgregaRespuesta("06", 5, "El contenido del documento TXT no es correcto.  El atributo Monto folio fiscal original tiene un valor no válido de acuerdo a su tipo de datos.", Resp)
                        End Try
                    Else
                        AgregaRespuesta("06", 5, "El contenido del documento TXT no es correcto, no se especifica el atributo monto folio fiscal original.", Resp)
                    End If
                Else
                    AgregaRespuesta("06", 0, "El contenido del documento TXT no es correcto. La sección 06 no contiene todos los elementos especificados.", Resp)
                End If
            Else
                AgregaRespuesta("06", 0, "El contenido del documento TXT no es correcto. La seccion 06 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            AgregaRespuesta("06", 0, ex.Message, Resp)
        End Try
    End Sub

End Class
